home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / DEMON / HAMRADIO / TERM93.ARC / Term93 / !SerialDev / Modules / InternalBF / internalbf (.txt) < prev   
RISC OS BBC BASIC V Source  |  1995-10-14  |  16KB  |  526 lines

  1.  >InternalBF
  2. -*| Alternative block driver specification
  3. A*| Internal serial driver using David Pilling's buffer module
  4. /*| Version 0.01 03-Jan-1995 Rainer Schubert
  5. .*| Version 1.03 15-March-1993 Hugo Fiennes
  6.  code 8192
  7. date$=
  8. $,5,11):z$=
  9. 4:code!I%=0:
  10. InsV=&14
  11. RemV=&15
  12. CnpV=&16
  13. V=1<<28
  14. C=1<<29
  15. Z=1<<30
  16. N=1<<31
  17. driver_number       = 0
  18. #flag_morethanone    = &00000001
  19. #flag_splitrates     = &00000002
  20. #flag_hardwarefifo   = &00000004
  21. #flag_controlbreak   = &00000008
  22. #flag_requirespoll   = &00000010
  23. #flag_wontempty      = &00000020
  24.  #flag_supportsblock  = &00000040
  25. !#flag_dontovio       = &00000080
  26. "#flag_supportsinquir = &00000100
  27. pass=0
  28. P%=code
  29. [OPT pass
  30. .entry
  31.       stmdb   r13!,{r14}
  32. ),      cmp     r0,#((endoftable-table)/4)
  33. *       addcc   pc,pc,r0,lsl#2
  34.       ldmia   r13!,{pc}
  35. .table
  36.       bal     put_byte
  37.       bal     get_byte
  38.       bal     put_block
  39.       bal     get_block
  40.       bal     check_tx
  41.       bal     check_rx
  42.       bal     flush_tx
  43.       bal     flush_rx
  44.       bal     control_lines
  45. 7$      bal     read_modem_control
  46. 8       bal     read_rx_errors
  47.       bal     send_break
  48.       bal     examine_byte
  49.       bal     tx_speed
  50.       bal     rx_speed
  51.       bal     wordformat
  52.       bal     flowcontrol
  53.       bal     initialise
  54.       bal     closedown
  55. A.      ldmia   r13!,{pc}^            ; Poll
  56. .endoftable
  57.       
  58. check_and_set(&80)
  59. .driverinfo
  60. F5      equs    "Risc PC internal port buffered"+z$
  61.       
  62. check_and_set(&A0)
  63. .manufacturerinfo
  64. J.      equs    "Rainer Schubert, DL6HBO"+z$
  65.       
  66. check_and_set(&C0)
  67. .version
  68. N+      equd    &00000001         ; v0.01
  69. .flags
  70. P\      equd    flag_splitrates + flag_supportsblock + flag_dontovio + flag_supportsinquir
  71. .drivernumber
  72. R"      equd    driver_number<<8
  73.       
  74. check_and_set(&100)
  75. .speeds
  76.       equd       50
  77.       equd       75
  78.       equd      110
  79.       equd      134
  80.       equd      150
  81.       equd      300
  82.       equd      600
  83.       equd     1200
  84.       equd     1800
  85.       equd     2400
  86.       equd     3600
  87.       equd     4800
  88.       equd     7200
  89.       equd     9600
  90.       equd    19200
  91. e#.speeds38400      equd    38400
  92.       equd    57600
  93.       equd   115200
  94.       equd        0
  95.       
  96.       
  97. check_and_set(&180)
  98. lM;--- Put byte routine ---------------------------------------------------
  99. .put_byte
  100.       mov     r0,#3
  101.       mov     r1,r2
  102. p       swi     "XOS_SerialOp"
  103.       movcc   r0,#0
  104.       mvncs   r0,#0
  105.       ldmia    r13!,{pc}^
  106. uM;--- Get byte routine ---------------------------------------------------
  107. .get_byte
  108.       mov     r0,#4
  109. x       swi     "XOS_SerialOp"
  110.       movcc   r0,r1
  111.       mvncs   r0,#0
  112.       ldmia    r13!,{pc}^
  113. }M;--- Put block ----------------------------------------------------------
  114. .put_block
  115.       swi     "XOS_IntOff"
  116.       stmdb   r13!,{r8,r9}
  117.       mov     r8,r3
  118.       mov     r9,#InsV
  119. !      mov     r1,#(2
  120. (1<<31))
  121. #      swi     "XOS_CallAVector"
  122.       sub     r0,r8,r3
  123.       ldmia   r13!,{r8,r9}
  124.       swi     "XOS_IntOn"
  125.       ldmia    r13!,{pc}^
  126. M;--- Get block ----------------------------------------------------------
  127. .get_block
  128.       swi     "XOS_IntOff"
  129.       stmdb   r13!,{r8-r9}
  130.       movs    r8,#0
  131.       mov     r8,r3
  132.       mov     r9,#RemV
  133. !      mov     r1,#(1
  134. (1<<31))
  135. #      swi     "XOS_CallAVector"
  136.       sub     r0,r8,r3
  137.       ldmia   r13!,{r8-r9}
  138.       swi     "XOS_IntOn"
  139.       ldmia    r13!,{pc}^
  140. M;--- Check TX buffer ----------------------------------------------------
  141. .check_tx
  142.       swi     "XOS_IntOff"
  143.       stmdb   r13!,{r9}
  144.       teqp    pc,#(2<<28)
  145.       mov     r9,#CnpV
  146.       mov     r1,#2
  147. #      swi     "XOS_CallAVector"
  148.       mov     r0,r1
  149.        orr     r0,r0,r2,lsl#8
  150.       ldmia   r13!,{r9}
  151.       swi     "XOS_IntOn"
  152.       ldmia    r13!,{pc}^
  153. M;--- Check RX buffer ----------------------------------------------------
  154. .check_rx
  155.       swi     "XOS_IntOff"
  156.       stmdb   r13!,{r9}
  157.       teqp    pc,#0
  158.       mov     r9,#CnpV
  159.       mov     r1,#1
  160. #      swi     "XOS_CallAVector"
  161.       mov     r0,r1
  162.        orr     r0,r0,r2,lsl#8
  163.       ldmia   r13!,{r9}
  164.       swi     "XOS_IntOn"
  165.       ldmia    r13!,{pc}^
  166. M;--- Flush TX buffer ----------------------------------------------------
  167. .flush_tx
  168.       swi     "XOS_IntOff"
  169.       stmdb   r13!,{r9}
  170.       teqp    pc,#V
  171.       mov     r9,#CnpV
  172.       mov     r1,#2
  173. #      swi     "XOS_CallAVector"
  174.       ldmia   r13!,{r9}
  175.       swi     "XOS_IntOn"
  176.       ldmia    r13!,{pc}^
  177. M;--- Flush RX buffer ----------------------------------------------------
  178. .flush_rx
  179.       swi     "XOS_IntOff"
  180.       stmdb   r13!,{r9}
  181.       teqp    pc,#V
  182.       mov     r9,#CnpV
  183.       mov     r1,#1
  184. #      swi     "XOS_CallAVector"
  185.       ldmia   r13!,{r9}
  186.       swi     "XOS_IntOn"
  187.       ldmia   r13!,{pc}^
  188. M;--- Control lines ------------------------------------------------------
  189. .control_lines
  190.       stmdb   r13!,{r2}
  191.       cmp     r2,#0
  192. $      blt     control_lines_read
  193.       tst     r2,#1
  194. ,      moveq   r1,#(1<<3)           ; DTR
  195.       movne   r1,#0
  196.       mvn     r2,#(1<<3)
  197.       mov     r0,#0
  198.        swi     "XOS_SerialOp"
  199.       ldr     r2,[r13,#0]
  200. ,      tst     r2,#2                ; RTS
  201.       movne   r1,#2
  202.       moveq   r1,#0
  203.       str     r1,last_rts
  204.       mov     r0,#2
  205.       swi     "XOS_Byte"
  206. .control_lines_read
  207.       mov     r0,#0
  208.       mov     r1,#0
  209.       mvn     r2,#0
  210.        swi     "XOS_SerialOp"
  211.       tst     r1,#(1<<3)
  212.       moveq   r3,#1
  213.       movne   r3,#0
  214.       ldr     r1,last_rts
  215.       cmp     r1,#0
  216.       orrne   r3,r3,#2
  217.       mov     r0,r3
  218.       ldmia   r13!,{r2}
  219.       ldmia   r13!,{pc}^
  220. .last_rts
  221.       equd    0
  222. M;--- Read modem control lines -------------------------------------------
  223. .read_modem_control
  224.       mov     r0,#0
  225.       mov     r1,#0
  226.       mvn     r2,#0
  227.        swi     "XOS_SerialOp"
  228.       mov     r0,#0
  229.       orr     r0,r0,#2
  230. ,      tst     r1,#(1<<18)          ; DCD
  231.       orreq   r0,r0,#1
  232. 5      tst     r1,#(1<<19)          ; DSR (ie CTS)
  233.       orrne   r0,r0,#(1<<3)
  234.       ldmia   r13!,{pc}^
  235. M;--- Read RX errors -----------------------------------------------------
  236. .read_rx_errors
  237.       mov     r0,#0
  238.       ldmia   r13!,{pc}^
  239. M;--- Send break ---------------------------------------------------------
  240. .send_break
  241.       mov     r0,#2
  242.       mov     r1,r2
  243.        swi     "XOS_SerialOp"
  244.       ldmia   r13!,{pc}^
  245. M;--- Examine byte -------------------------------------------------------
  246. .examine_byte
  247.       mov     r0,#&98
  248.       mov     r1,#1
  249.       swi     "OS_Byte"
  250.       mvncs   r0,#0
  251.       movcc   r0,r2
  252.       ldmia   r13!,{pc}^
  253. M;--- Set speed ----------------------------------------------------------
  254. .tx_speed_mask
  255.       equd    &03010FE0
  256. .tx_speed
  257.       cmp     r2,#0
  258.       blt     tx_speed_read
  259.        adr     r3,speed_table
  260. .tx_speed_loop
  261.       ldr     r1,[r3],#8
  262.       cmp     r1,#0
  263.       beq     tx_speed_read
  264.       cmp     r1,r2
  265. %       beq     tx_speed_found
  266.       bal     tx_speed_loop
  267. .tx_speed_found
  268. )"      str     r2,tx_speed_last
  269. *       ldr     r0,sevenfourty
  270.       ldr     r1,[r3,#-4]
  271.       cmp     r0,#0
  272. -!      beq     tx_speed_normal
  273.       cmp     r0,#1
  274.       beq     tx_speed_one
  275.       cmp     r0,#2
  276.       beq     tx_speed_two
  277. 2!      bal     tx_speed_normal
  278. .tx_speed_two
  279.       tst     r1,#&FF
  280. 5!      bne     tx_speed_normal
  281.       mov     r1,r1,lsr #16
  282.       rsb     r1,r1,#&13
  283. 8!      bal     tx_speed_normal
  284. .tx_speed_one
  285.       swi     "XOS_EnterOS"
  286. ;"      ldr     r0,tx_speed_mask
  287.       ldrb    r2,[r0,#12]
  288.       orr     r2,r2,#&80
  289.       strb    r2,[r0,#12]
  290.       mov     r2,#6
  291.       strb    r2,[r0,#0]
  292.       mov     r2,#0
  293.       strb    r2,[r0,#4]
  294.       ldrb    r2,[r0,#12]
  295.       bic     r2,r2,#&80
  296.       strb    r2,[r0,#12]
  297. F+      teqp    pc,#0           ; exit os
  298. G'      mov     r0,r0           ; NOP
  299.       stmdb   r13!,{r1}
  300.       mov     r0,#6
  301.       mov     r1,#8
  302. K       swi     "XOS_SerialOp"
  303.       ldmia   r13!,{r1}
  304.       tst     r1,#&FF
  305. N!      bne     tx_speed_normal
  306.       swi     "XOS_EnterOS"
  307. P"      ldr     r0,tx_speed_mask
  308.       ldrb    r2,[r0,#12]
  309.       orr     r2,r2,#&80
  310.       strb    r2,[r0,#12]
  311.       mov     r1,r1,lsr #16
  312.       strb    r1,[r0,#0]
  313.       mov     r1,r1,lsr #8
  314.       strb    r1,[r0,#4]
  315.       ldrb    r2,[r0,#12]
  316.       bic     r2,r2,#&80
  317.       strb    r2,[r0,#12]
  318. [+      teqp    pc,#0           ; exit os
  319. \'      mov     r0,r0           ; NOP
  320.       bal     tx_speed_read
  321. .tx_speed_normal
  322.       mov     r0,#6
  323. `       swi     "XOS_SerialOp"
  324. .tx_speed_read
  325. b"      ldr     r0,tx_speed_last
  326.       ldmia   r13!,{pc}^
  327. .rx_speed
  328.       cmp     r2,#0
  329.       blt     rx_speed_read
  330. i       adr     r3,speed_table
  331. .rx_speed_loop
  332.       ldr     r1,[r3],#8
  333.       cmp     r1,#0
  334.       beq     rx_speed_read
  335.       cmp     r1,r2
  336. o       beq     rx_speed_found
  337.       bal     rx_speed_loop
  338. .rx_speed_found
  339. s"      str     r2,rx_speed_last
  340. u       ldr     r0,sevenfourty
  341.       ldr     r1,[r3,#-4]
  342.       cmp     r0,#0
  343. x!      beq     rx_speed_normal
  344.       cmp     r0,#1
  345.       beq     rx_speed_one
  346.       cmp     r0,#2
  347.       beq     rx_speed_two
  348.       bal     rx_speed_read
  349. .rx_speed_two
  350.       tst     r1,#&FF
  351. !      bne     rx_speed_normal
  352.       mov     r1,r1,lsr #16
  353.       rsb     r1,r1,#&13
  354. !      bal     rx_speed_normal
  355. .rx_speed_one
  356.       swi     "XOS_EnterOS"
  357. "      ldr     r0,tx_speed_mask
  358.       ldrb    r2,[r0,#12]
  359.       orr     r2,r2,#&80
  360.       strb    r2,[r0,#12]
  361.       mov     r2,#6
  362.       strb    r2,[r0,#0]
  363.       mov     r2,#0
  364.       strb    r2,[r0,#4]
  365.       ldrb    r2,[r0,#12]
  366.       bic     r2,r2,#&80
  367.       strb    r2,[r0,#12]
  368. +      teqp    pc,#0           ; exit os
  369. '      mov     r0,r0           ; NOP
  370.       stmdb   r13!,{r1}
  371.       mov     r0,#6
  372.       mov     r1,#8
  373.        swi     "XOS_SerialOp"
  374.       ldmia   r13!,{r1}
  375.       tst     r1,#&FF
  376. !      bne     rx_speed_normal
  377.       swi     "XOS_EnterOS"
  378. "      ldr     r0,tx_speed_mask
  379.       ldrb    r2,[r0,#12]
  380.       orr     r2,r2,#&80
  381.       strb    r2,[r0,#12]
  382.       mov     r1,r1,lsr #16
  383.       strb    r1,[r0,#0]
  384.       mov     r1,r1,lsr #8
  385.       strb    r1,[r0,#4]
  386.       ldrb    r2,[r0,#12]
  387.       bic     r2,r2,#&80
  388.       strb    r2,[r0,#12]
  389. +      teqp    pc,#0           ; exit os
  390. '      mov     r0,r0           ; NOP
  391.       bal     rx_speed_read
  392.       
  393. .rx_speed_normal
  394.       mov     r0,#5
  395.        swi     "XOS_SerialOp"
  396. .rx_speed_read
  397. "      ldr     r0,rx_speed_last
  398.       ldmia   r13!,{pc}^
  399. .speed_table
  400.       equd       50:equd  9
  401.       equd       75:equd  1
  402.       equd      110:equd 10
  403.       equd      134:equd 11
  404.       equd      150:equd  2
  405.       equd      300:equd  3
  406.       equd      600:equd 12
  407.       equd     1200:equd  4
  408.       equd     1800:equd 13
  409.       equd     2400:equd  5
  410.       equd     3600:equd 14
  411.       equd     4800:equd  6
  412.       equd     7200:equd 15
  413.       equd     9600:equd  7
  414.       equd    19200:equd  8
  415. ;.sp38400      equd    38400: .sp38400data  equd  &30000
  416. $      equd    57600:equd  &20000
  417. $      equd   115200:equd  &10000
  418.       equd        0:equd  0
  419. .tx_speed_last
  420.       equd    115200
  421. .rx_speed_last
  422.       equd    115200
  423. M;--- Set word format ----------------------------------------------------
  424. .wordformat
  425.       cmp     r2,#0
  426. !      blt     wordformat_read
  427.       mov     r0,#1
  428.       mov     r1,r2
  429. $      str     r1,wordformat_last
  430.        swi     "XOS_SerialOp"
  431. .wordformat_read
  432. $      ldr     r0,wordformat_last
  433.       ldmia   r13!,{pc}^
  434. .wordformat_last
  435.       equd    0
  436. M;--- Set flow control ---------------------------------------------------
  437. .flowcontrol
  438.       stmdb   r13!,{r2}
  439.       mov     r0,#203
  440.       mov     r1,#100
  441.       mov     r2,#0
  442.       swi     "XOS_Byte"
  443.       mov     r0,#0
  444.       mov     r1,#0
  445. %      ldr     r2,flowcontrol_mask
  446.        swi     "XOS_SerialOp"
  447.       mov     r0,#0
  448.       mov     r1,#1
  449. %      ldr     r2,flowcontrol_mask
  450.        swi     "XOS_SerialOp"
  451.       mov     r0,#0
  452.       mov     r1,#0
  453. %      ldr     r2,flowcontrol_mask
  454.        swi     "XOS_SerialOp"
  455.       ldmia   r13!,{r3}
  456.       cmp     r3,#0
  457. &      ldrlt   r0,flowcontrol_dunno
  458.       ldmltia r13!,{pc}^
  459. 4      moveq   r1,#4        ; No flow, ignore DSR
  460.       cmp     r3,#1
  461. 1      moveq   r1,#0        ; Hardware control
  462.       cmp     r3,#2
  463. 5      moveq   r1,#5        ; Xon/xoff, ignore DSR
  464.       cmp     r3,#3
  465. %      moveq   r1,#1        ; Both
  466.       mov     r0,#0
  467.       mvn     r2,#5
  468.        swi     "XOS_SerialOp"
  469. &      ldr     r0,flowcontrol_dunno
  470. &      str     r3,flowcontrol_dunno
  471.       ldmia   r13!,{pc}^
  472. .flowcontrol_mask
  473.       equd    &fffdfffe
  474. .flowcontrol_last
  475.       equd    &fffdffee
  476.       
  477. .flowcontrol_dunno
  478. <      equd    0     ; don't know what this is for (&6CC)
  479. D                    ; used as a replacement for flowcontrol_last
  480. M;--- Initialise driver --------------------------------------------------
  481. .initialise
  482.       stmdb   r13!,{r1-r8}
  483.       mov     r8,r1
  484.       mov     r0,#2
  485. "      swi     "OS_ReadSysInfo"
  486.       bvs     init_two
  487.       cmp     r1,#0
  488.       beq     init_two
  489.       mov     r0,#3
  490. "      swi     "OS_ReadSysInfo"
  491.       tst     r1,#&F000
  492.       moveq   r0,#1
  493.       movne   r0,#2
  494.        str     r0,sevenfourty
  495.       bal     init_three
  496. .init_two
  497.       mov     r0,#0
  498. #C      str     r0,sp38400      ; end speedtable for old hardware
  499. $       str     r0,sp38400data
  500. %9      str     r0,speeds38400  ; dito for speeds table
  501. &       str     r0,sevenfourty
  502. .init_three
  503.       cmn     r8,#1
  504.       beq     init_four
  505.       mov     r2,#3
  506.       adr     r14,init_four
  507.       stmdb   r13!,{r14}
  508.       bl      control_lines
  509. .init_four
  510.       movs    r0,#0
  511.       ldmia   r13!,{r1-r8}
  512.       ldmia   r13!,{pc}^
  513. 2M;--- An unknown label ---------------------------------------------------
  514. .sevenfourty
  515. 4<      equd    0     ; don't know what this is for (&740)
  516. 6M;--- Close down driver --------------------------------------------------
  517. .closedown
  518.       ldmia    r13!,{pc}^
  519. "OS_File",10,"SerialDev:Modules.InternalBF.Driver",&FFD,,code,P%
  520.  SYS"OS_File",10,"^.!SerialDev.Modules.InternalBF.Driver",&FFD,,code,P%
  521. check_and_set(A%):
  522.  (P%-code)>A% 
  523.  1,"Block &"+
  524. ~A%+" exceeded"::=0
  525. P%=code+A%:=0
  526.